#!/bin/sh

# src/tools/make_ctags

command -v ctags >/dev/null || \
	{ echo "'ctags' program not found" 1>&2; exit 1; }

trap "rm -f /tmp/$$" 0 1 2 3 15
rm -f ./tags

IS_EXUBERANT=""
ctags --version 2>&1 | grep Exuberant && IS_EXUBERANT="Y"

# List of kinds supported by Exuberant Ctags 5.8
# generated by ctags --list-kinds
# --c-kinds was called --c-types before 2003
#    c  classes
#    d  macro definitions
#    e  enumerators (values inside an enumeration)
#    f  function definitions
#    g  enumeration names
#    l  local variables [off]
#    m  class, struct, and union members
#    n  namespaces
#    p  function prototypes [off]
#    s  structure names
#    t  typedefs
#    u  union names
#    v  variable definitions
#    x  external and forward variable declarations [off]

if [ "$IS_EXUBERANT" ]
then	FLAGS="--c-kinds=+dfmstuv"
else	FLAGS="-dt"
fi

# this is outputting the tags into the file 'tags', and appending
find `pwd`/ -type f -name '*.[chyl]' -print |
	xargs ctags -a -f tags "$FLAGS"

# Exuberant tags has a header that we cannot sort in with the other entries
# so we skip the sort step
# Why are we sorting this?  I guess some tag implementation need this,
# particularly for append mode.  bjm 2012-02-24
if [ ! "$IS_EXUBERANT" ]
then	LC_ALL=C
	export LC_ALL
	sort tags >/tmp/$$ && mv /tmp/$$ tags
fi

find . \( -name 'CVS' -prune \) -o \( -name .git -prune \) -o -type d -print |
while read DIR
do	[ "$DIR" != "." ] && ln -f -s `echo "$DIR" | sed 's;/[^/]*;/..;g'`/tags "$DIR"/tags
done
